package com.unitd.base.module.logistics.api;

import com.unitd.base.frame.enums.ResultEnum;
import com.unitd.base.frame.exception.LogisticsException;
import com.unitd.base.frame.utils.encrypt.EncryptUtils;
import com.unitd.base.frame.utils.http.HttpClients;
import com.unitd.base.module.logistics.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * 快递鸟物流轨迹即时查询接口
 * DEMO中的电商ID与私钥仅限测试使用，正式环境请单独注册账号
 * 单日超过500单查询量，建议接入快递鸟物流轨迹订阅推送接口
 * ID和Key请到官网申请：http://www.kdniao.com/ServiceApply.aspx
 * @filename TrackQuery.java
 * @copyright www.unitd.com
 * @author hudan
 * @version 1.0
 * @date 2019-01-25
 */
@Slf4j
@Component
public class TrackQuery {

	/**
	 * 向快递鸟发起物流轨迹即时查询请求
	 * @param expCode 快递公司编号
	 * @param expNo   快递单号
	 * @return 本期
	 */
	public String getTrackQueryByExpCodeAndNo(String expCode, String expNo) {
		String result;

		try {
			String requestData = "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
			String dataSign = EncryptUtils.encrypt(requestData, Constants.APPKEY, Constants.CHARSET);

			Map<String, String> params = new HashMap<>();
			// 电商ID(即用户在快递鸟申请的用户ID)
			params.put("EBusinessID", Constants.APPID);
			// 请求、返回数据类型：1-xml,2-json；默认为xml格式
			params.put("DataType", "2");
			// 请求指令类型
			params.put("RequestType", "1002");
			// 请求内容，JSON或XML格式,须和DataType一致
			params.put("RequestData", URLEncoder.encode(requestData, Constants.CHARSET));
			// 数据内容签名
			params.put("DataSign", URLEncoder.encode(dataSign, Constants.CHARSET));
			log.info("本次物流轨迹即时查询请求参数为: {}", params);

			// 发起请求,并得到相应的结果
			result = HttpClients.doPost(Constants.REQ_URL, params, Constants.CHARSET);
			log.info("得到本次请求的物流轨迹信息为: {}", result);
		} catch (Exception e) {
			throw new LogisticsException(ResultEnum.TRACKQUERY_ERROR);
		}
		return result;
	}
}